@@ -57,6 +57,7 @@ |
||
57 | 57 |
}, |
58 | 58 |
{ |
59 | 59 |
label: 'Preferences', |
60 |
+ accelerator: 'CommandOrControl+,', |
|
60 | 61 |
click: function () { |
61 | 62 |
ipc.send('show-preferences-window') |
62 | 63 |
} |
@@ -2,46 +2,47 @@ |
||
2 | 2 |
<html class="no-js"> |
3 | 3 |
|
4 | 4 |
<head> |
5 |
- <title>Codex</title> |
|
5 |
+ <title>Codex Preferences</title> |
|
6 | 6 |
<meta charset="UTF-8"> |
7 | 7 |
<!-- Stylesheets --> |
8 | 8 |
<link rel="stylesheet" href="../css/tomorrow-night-eighties.css"> |
9 | 9 |
<link rel="stylesheet" href="../css/photon.min.css"> |
10 | 10 |
<link rel="stylesheet" href="../css/codex.css"> |
11 | 11 |
|
12 |
+ <script src="../bower_components/angular/angular.js"></script> |
|
13 |
+ <script src="../bower_components/angular-ui-router/release/angular-ui-router.js"></script> |
|
14 |
+ <script src="../bower_components/angular-sanitize/angular-sanitize.js"></script> |
|
15 |
+ |
|
16 |
+ <script src="scripts/preferences.js"></script> |
|
17 |
+ <script src="scripts/controllers/general-prefs-ctrl.js"></script> |
|
18 |
+ <script src="scripts/controllers/databases-prefs-ctrl.js"></script> |
|
19 |
+ <script src="scripts/controllers/prefs-nav-ctrl.js"></script> |
|
20 |
+ <script src="scripts/services/file-service.js"></script> |
|
21 |
+ <script src="scripts/services/thumbnail-service.js"></script> |
|
22 |
+ <script src="scripts/services/prefs-service.js"></script> |
|
23 |
+ |
|
12 | 24 |
<script> |
13 | 25 |
var remote = require('remote'); |
14 | 26 |
var ipc = require('ipc'); |
15 | 27 |
var dialog = remote.require('dialog'); |
28 |
+ console.log("-> Opening Preferences Window") |
|
16 | 29 |
</script> |
17 | 30 |
</head> |
18 | 31 |
|
19 |
- <body> |
|
32 |
+ <body ng-app="codexApp"> |
|
20 | 33 |
<header class="toolbar toolbar-header"> |
21 | 34 |
<h1 class="title">Preferences</h1> |
22 | 35 |
|
23 |
- <ul class="icon-tabs"> |
|
24 |
- <li class="active"> |
|
36 |
+ <ul class="icon-tabs" ng-controller="PrefsNavCtrl"> |
|
37 |
+ <li ng-class="links[0]" ng-click="goToGeneral()"> |
|
25 | 38 |
<img src="content/imgs/prefs-icon.png" style="width: 32px; height: 32px;"><br>General |
26 | 39 |
</li> |
27 |
- <li> |
|
40 |
+ <li ng-class="links[1]" ng-click="goToDatabases()"> |
|
28 | 41 |
<img src="content/imgs/db-icon.png" style="width: 32px; height: 32px;"><br>Databases |
29 | 42 |
</li> |
30 | 43 |
</ul> |
31 | 44 |
</header> |
32 |
- <div class="well"> |
|
33 |
- <p>Default View when opening the app:<br> |
|
34 |
- <select class="form-control" style="width: 220px;"> |
|
35 |
- <option>All Notes</option> |
|
36 |
- <option>All Files</option> |
|
37 |
- <option>Index note</option> |
|
38 |
- </select></p> |
|
39 |
- <p>Default Notebook: |
|
40 |
- <select class="form-control" style="width: 220px;"> |
|
41 |
- <option>Notebook 1</option> |
|
42 |
- <option>Notebook 2</option> |
|
43 |
- <option>Notebook 3</option> |
|
44 |
- </select></p> |
|
45 |
+ <div ui-view class="well"> |
|
45 | 46 |
|
46 | 47 |
</div> |
47 | 48 |
</body> |
@@ -0,0 +1,31 @@ |
||
1 |
+ |
|
2 |
+ |
|
3 |
+/** |
|
4 |
+ * @ngdoc function |
|
5 |
+ * @name domainManagerApp.controller:AboutCtrl |
|
6 |
+ * @description |
|
7 |
+ * # AboutCtrl |
|
8 |
+ * Controller of the domainManagerApp |
|
9 |
+ */ |
|
10 |
+ |
|
11 |
+angular.module('codexApp.prefs.databases', []) |
|
12 |
+ .controller('DatabasesPrefsCtrl', ['$scope', '$rootScope', '$state', '$location', 'FileService', 'PrefsService', '$timeout', function ($scope, $rootScope, $state, $location, FileService, PrefsService, $timeout) { |
|
13 |
+ |
|
14 |
+ console.log("-> Preferences/General"); |
|
15 |
+ $scope.notesDir = FileService.getNotesDir(); |
|
16 |
+ |
|
17 |
+ $scope.changeDir = function(){ |
|
18 |
+ dialog.showOpenDialog({ defaultPath: FileService.getNotesDir(), properties: ['openDirectory'] }, function (dir) { |
|
19 |
+ console.log("-> Changin folder location to: " + dir); |
|
20 |
+ FileService.setNotesDir(dir); |
|
21 |
+ if(!$scope.$$phase) { |
|
22 |
+ $scope.$apply(function(){ |
|
23 |
+ $scope.notesDir = dir[0]; |
|
24 |
+ }); |
|
25 |
+ } else { |
|
26 |
+ $scope.notesDir = dir[0]; |
|
27 |
+ } |
|
28 |
+ }); |
|
29 |
+ } |
|
30 |
+ |
|
31 |
+ }]); |
@@ -0,0 +1,17 @@ |
||
1 |
+ |
|
2 |
+ |
|
3 |
+/** |
|
4 |
+ * @ngdoc function |
|
5 |
+ * @name domainManagerApp.controller:AboutCtrl |
|
6 |
+ * @description |
|
7 |
+ * # AboutCtrl |
|
8 |
+ * Controller of the domainManagerApp |
|
9 |
+ */ |
|
10 |
+ |
|
11 |
+angular.module('codexApp.prefs.general', []) |
|
12 |
+ .controller('GeneralPrefsCtrl', ['$scope', '$rootScope', '$state', '$location', 'FileService', 'PrefsService', '$timeout', function ($scope, $rootScope, $state, $location, FileService, PrefsService, $timeout) { |
|
13 |
+ |
|
14 |
+ console.log("-> Preferences/General"); |
|
15 |
+ |
|
16 |
+ |
|
17 |
+ }]); |
@@ -0,0 +1,33 @@ |
||
1 |
+ |
|
2 |
+ |
|
3 |
+/** |
|
4 |
+ * @ngdoc function |
|
5 |
+ * @name domainManagerApp.controller:AboutCtrl |
|
6 |
+ * @description |
|
7 |
+ * # AboutCtrl |
|
8 |
+ * Controller of the domainManagerApp |
|
9 |
+ */ |
|
10 |
+ |
|
11 |
+angular.module('codexApp.prefs.nav', []) |
|
12 |
+ .controller('PrefsNavCtrl', ['$scope', '$rootScope', '$state', '$location', 'FileService', 'PrefsService', '$timeout', function ($scope, $rootScope, $state, $location, FileService, PrefsService, $timeout) { |
|
13 |
+ |
|
14 |
+ $scope.links = []; |
|
15 |
+ console.log("-> Preferences/General"); |
|
16 |
+ $scope.links[0] = "active"; |
|
17 |
+ $scope.links[1] = ""; |
|
18 |
+ |
|
19 |
+ $scope.goToGeneral = function () { |
|
20 |
+ console.log("-> Preferences/General") |
|
21 |
+ $scope.links[0] = "active"; |
|
22 |
+ $scope.links[1] = ""; |
|
23 |
+ $state.go("general"); |
|
24 |
+ } |
|
25 |
+ |
|
26 |
+ $scope.goToDatabases = function () { |
|
27 |
+ console.log("-> Preferences/Databases") |
|
28 |
+ $scope.links[0] = ""; |
|
29 |
+ $scope.links[1] = "active"; |
|
30 |
+ $state.go("databases"); |
|
31 |
+ } |
|
32 |
+ |
|
33 |
+ }]); |
@@ -0,0 +1,36 @@ |
||
1 |
+angular |
|
2 |
+ .module('codexApp', [ |
|
3 |
+ 'ui.router', |
|
4 |
+ 'ngSanitize', |
|
5 |
+ 'codexApp.prefs.nav', |
|
6 |
+ 'codexApp.prefs.general', |
|
7 |
+ 'codexApp.prefs.databases' |
|
8 |
+ |
|
9 |
+ ]) |
|
10 |
+ |
|
11 |
+ .config(['$stateProvider', '$urlRouterProvider', '$httpProvider', function($stateProvider, $urlRouterProvider, $httpProvider) { |
|
12 |
+ |
|
13 |
+ // Configs |
|
14 |
+ //Enable cross domain calls |
|
15 |
+ $httpProvider.defaults.useXDomain = true; |
|
16 |
+ //Remove the header used to identify ajax call that would prevent CORS from working |
|
17 |
+ delete $httpProvider.defaults.headers.common['X-Requested-With']; |
|
18 |
+ |
|
19 |
+ // UI router |
|
20 |
+ // For any unmatched url, redirect to /state1 |
|
21 |
+ |
|
22 |
+ $stateProvider |
|
23 |
+ .state('general', { |
|
24 |
+ url: "/", |
|
25 |
+ templateUrl: 'views/preferences/general.html', |
|
26 |
+ controller: 'GeneralPrefsCtrl' |
|
27 |
+ }) |
|
28 |
+ .state('databases', { |
|
29 |
+ url: "/databases", |
|
30 |
+ templateUrl: 'views/preferences/databases.html', |
|
31 |
+ controller: 'DatabasesPrefsCtrl' |
|
32 |
+ }) |
|
33 |
+ $urlRouterProvider.otherwise("/"); |
|
34 |
+ |
|
35 |
+ |
|
36 |
+ }]); |
@@ -1,15 +1,21 @@ |
||
1 | 1 |
angular.module('codexApp') |
2 | 2 |
.service('FileService', [ '$rootScope', '$http', 'ThumbnailService', '$state', function($rootScope, $http, ThumbnailService, $state) { |
3 | 3 |
|
4 |
+ var defaultUserContentPath = ""; |
|
5 |
+ var appDataPath = ""; |
|
6 |
+ var appData = {}; |
|
7 |
+ var notes_dir = ""; |
|
8 |
+ |
|
4 | 9 |
var getAppData = function(){ |
5 | 10 |
var remote = require('remote'); |
6 | 11 |
var app = remote.require('app'); |
7 |
- var appDataPath = app.getPath("userData"); |
|
8 |
- var defaultUserContentPath = app.getPath("home") + "/Documents"; |
|
12 |
+ appDataPath = app.getPath("userData"); |
|
13 |
+ defaultUserContentPath = app.getPath("home") + "/Documents/codex"; |
|
9 | 14 |
findOrGenerateUserDataFile(appDataPath, defaultUserContentPath); |
10 | 15 |
var raw_data = fs.readFileSync(appDataPath + '/userData.json', 'utf8'); |
11 | 16 |
var data = JSON.parse(raw_data); |
12 |
- console.log(data); |
|
17 |
+ appData = data; |
|
18 |
+ notes_dir = appData.UserDataDirectory; |
|
13 | 19 |
return data |
14 | 20 |
} |
15 | 21 |
|
@@ -27,14 +33,31 @@ angular.module('codexApp') |
||
27 | 33 |
file_path = path + "/UserData.json"; |
28 | 34 |
console.log("-> Generating user settings file: '" + file_path + "'"); |
29 | 35 |
var content = '{ "UserDataDirectory" : "' + defaultUserContentPath +'" }'; |
30 |
- fs.writeFileSync(file_path, content, 'utf8'); |
|
36 |
+ mkdirSync(defaultUserContentPath); |
|
37 |
+ console.log(content); |
|
38 |
+ saveAppData(JSON.parse(content)); |
|
31 | 39 |
return true; |
32 | 40 |
} |
33 | 41 |
} |
34 | 42 |
|
35 |
- var appData = getAppData(); |
|
43 |
+ var saveAppData = function(data) { |
|
44 |
+ console.log("-> Saving user data..."); |
|
45 |
+ console.log(data); |
|
46 |
+ fs.writeFileSync(appDataPath + "/UserData.json", JSON.stringify(data), 'utf8'); |
|
47 |
+ } |
|
48 |
+ |
|
49 |
+ var mkdirSync = function (path) { |
|
50 |
+ try { |
|
51 |
+ fs.mkdirSync(path); |
|
52 |
+ } catch(e) { |
|
53 |
+ if ( e.code != 'EEXIST' ) throw e; |
|
54 |
+ } |
|
55 |
+ } |
|
56 |
+ |
|
57 |
+ getAppData(); |
|
58 |
+ console.log("-> Loading content from folder: " + appData.UserDataDirectory); |
|
59 |
+ |
|
36 | 60 |
|
37 |
- var notes_dir = appData.UserDataDirectory; |
|
38 | 61 |
var default_notes_dir = "/Users/james/dev/codex/codex/inbox"; |
39 | 62 |
var default_home_note = "/Users/james/dev/codex/codex/index.md" |
40 | 63 |
var notes = []; |
@@ -436,18 +459,21 @@ angular.module('codexApp') |
||
436 | 459 |
|
437 | 460 |
// RESPONSE |
438 | 461 |
this.getAllFiles = function(dir) { |
462 |
+ getAppData(); |
|
439 | 463 |
if (typeof(dir)==='undefined') dir = notes_dir; |
440 | 464 |
notes = getAllFilesFromFolder(dir); |
441 | 465 |
return notes.sort(date_sort_asc); |
442 | 466 |
} |
443 | 467 |
|
444 | 468 |
this.getFiles = function(dir) { |
469 |
+ getAppData(); |
|
445 | 470 |
if (typeof(dir)==='undefined') dir = notes_dir; |
446 | 471 |
notes = getFilesFromFolder(dir); |
447 | 472 |
return notes.sort(date_sort_asc); |
448 | 473 |
} |
449 | 474 |
|
450 | 475 |
this.getAllNotes = function() { |
476 |
+ getAppData(); |
|
451 | 477 |
notes = getAllFilesFromFolder(); |
452 | 478 |
notes = filterNotes(notes); |
453 | 479 |
return notes.sort(date_sort_asc); |
@@ -493,6 +519,12 @@ angular.module('codexApp') |
||
493 | 519 |
} |
494 | 520 |
} |
495 | 521 |
|
522 |
+ this.setNotesDir = function(dir) { |
|
523 |
+ appData.UserDataDirectory = dir[0]; |
|
524 |
+ saveAppData(appData); |
|
525 |
+ notes_dir = dir[0]; |
|
526 |
+ } |
|
527 |
+ |
|
496 | 528 |
this.getNotesDir = function() { |
497 | 529 |
return notes_dir; |
498 | 530 |
} |
@@ -0,0 +1,4 @@ |
||
1 |
+<p>Root Folder:<br> |
|
2 |
+<textarea class="form-control well" rows="2" disabled style="background-color: #E2E2E2; border-color: #DEDEDE; float: left; width: 380px; margin-right: 25px;">{{notesDir}}</textarea> |
|
3 |
+<button class="btn btn-mini btn-default" ng-click="changeDir()">Change</button> |
|
4 |
+</p> |
@@ -0,0 +1,14 @@ |
||
1 |
+<p>Default View when opening the app:<br> |
|
2 |
+<select class="form-control" style="width: 220px;"> |
|
3 |
+ <option>All Notes</option> |
|
4 |
+ <option>All Files</option> |
|
5 |
+ <option>Index note</option> |
|
6 |
+</select></p> |
|
7 |
+<p> |
|
8 |
+ Default Notebook: |
|
9 |
+ <select class="form-control" style="width: 220px;"> |
|
10 |
+ <option>Notebook 1</option> |
|
11 |
+ <option>Notebook 2</option> |
|
12 |
+ <option>Notebook 3</option> |
|
13 |
+ </select> |
|
14 |
+</p> |